package com.base.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.base.constant.Constants;
import com.base.domain.SysConfig;
import com.base.enums.DeletedEnum;
import com.base.mapper.SysConfigMapper;
import com.base.service.SysConfigService;
import com.base.utils.BeanUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author gxd
 * @since 2025/6/6
 */
@Slf4j
@Service
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements SysConfigService {

    /**
     * 分页列表-配置列表
     * @param config 配置查询条件
     * @return 配置列表
     */
    @Override
    public List<SysConfig> pageList(SysConfig config) {
        List<SysConfig> list = this.list(
                Wrappers.lambdaQuery(SysConfig.class)
                        .eq(SysConfig::getDeleted, DeletedEnum.NO.getCode())
                        .like(StrUtil.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName())
                        .like(StrUtil.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey())
                        .eq(ObjUtil.isNotNull(config.getType()), SysConfig::getType, config.getType())
                        .gt(StrUtil.isNotBlank(config.getStartTime()), SysConfig::getCreateTime, StrUtil.isNotBlank(config.getStartTime()) ? DateUtil.beginOfDay(DateUtil.parse(config.getStartTime(), Constants.YYYY_MM_DD)) : null)
                        .lt(StrUtil.isNotBlank(config.getEndTime()), SysConfig::getCreateTime, StrUtil.isNotBlank(config.getEndTime()) ? DateUtil.endOfDay(DateUtil.parse(config.getEndTime(), Constants.YYYY_MM_DD)) : null)
                        .orderByAsc(SysConfig::getCreateTime)
        );
        return list;
    }

    /**
     * 添加或修改-配置信息
     * @param config 配置实体
     * @return 配置信息
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public SysConfig addOrEdit(SysConfig config) {
        Assert.notNull(config, "配置信息不能为空");
        if (ObjUtil.isNotNull(config.getId())) {
            SysConfig configInfo = Assert.notNull(this.getById(config.getId()), "要修改的配置记录不存在");
            BeanUtils.copyNotEmptyProperties(config, configInfo);
            this.updateById(configInfo);
            return configInfo;
        }

        config.setDeleted(DeletedEnum.NO.getCode());
        this.save(config);
        return config;
    }
}
